package com.chenziwen.scala.chapter05;

/**
 * @ClassName PerfectJavaSingleton
 * @Description 比较完美的Java写单例的方式
 * @Author Administrator
 * @Date 2019/10/15 18:08
 * @Version 1.0
 **/
public class PerfectJavaSingleton {

    private PerfectJavaSingleton() {

    }

    private static class SingletonInstance {
        /**
         * 此处通过静态内部类的形式，定义一个目标对象
         * 静态内部类，有一个特点，就是在类加载的时候，静态内部类中的对象不会自动创建，当用到的时候才会创建
         * 还有一个很重要的特点是：类在加载的时候，是无法被其它线程打断的，所以也不会存在多线程并发访问，创建多个对象的问题
         */
        private static final PerfectJavaSingleton INSTANCE = new PerfectJavaSingleton();
    }

    /**
     * 当该方法被调用时，INSTANCE才会被创建
     *
     * @return
     */
    public static PerfectJavaSingleton getInstance() {
        // 直接返回静态内部类中定义的目标对象
        return SingletonInstance.INSTANCE;
    }

}
